package com.xsf.jieyou.business.utils;

import com.baidu.aip.face.AipFace;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;

/**
 * 百度AI 工具类
 *
 * @author xsfno1
 * @version v1.0.0
 * @date 2020/3/11 4:37
 * @see com.xsf.jieyou.business.utils
 **/
@Component
public class BaiduAiUtil {

    @Value("${baiduai.appId}")
    private String appId;
    @Value("${baiduai.apiKey}")
    private String apiKey;
    @Value("${baiduai.secretKey}")
    private String secretKey;
    @Value("${baiduai.imageType}")
    private String imageType;
    @Value("${baiduai.groupId}")
    private String groupId;

    private AipFace client;

    private HashMap<String, String> options = new HashMap<String, String>();

    public BaiduAiUtil() {
        options.put("quality_control", "NORMAL");
        options.put("liveness_control", "LOW");
    }

    @PostConstruct
    public void init() {
        this.client = new AipFace(this.appId, this.apiKey, this.secretKey);
    }

    /**
     * 判断用户是否已经注册了面部信息
     */
    public Boolean faceExist(String userId) throws JSONException {
        //返回error_code：0 （存在），非0：不存在
        JSONObject res = this.client.getUser(userId, this.groupId, null);
        // error_code : 0   表示成功
        return res.getInt("error_code") == 0;
    }

    /**
     * 人脸注册 ：将用户照片存入人脸库中
     */
    public Boolean faceRegister(String userId, String image) throws JSONException {
        // 人脸注册
        JSONObject res = this.client.addUser(image, this.imageType, this.groupId, userId, this.options);
        System.out.println(res);
        // error_code : 0   表示成功
        return res.getInt("error_code") == 0;
    }

    /**
     * 人脸更新 ：更新人脸库中的用户照片
     */
    public Boolean faceUpdate(String userId, String image) throws JSONException {
        // 人脸更新
        JSONObject res = this.client.updateUser(image, this.imageType, this.groupId, userId, this.options);
        System.out.println(res);
        // error_code : 0   表示成功
        return res.getInt("error_code") == 0;
    }

    /**
     * 人脸检测：判断上传图片中是否具有面部头像
     */
    public Boolean faceCheck(String image) throws JSONException {
        JSONObject res = this.client.detect(image, this.imageType, this.options);
        if (res.has("error_code") && res.getInt("error_code") == 0) {
            JSONObject resultObject = res.getJSONObject("result");
            //检测的人脸数量:只能存在1人
            return resultObject.getInt("face_num") == 1;
        }
        return false;
    }

    /**
     * 人脸查找：查找人脸库中最相似的人脸并返回数据
     * 处理：用户的匹配得分（score）大于80分，即可认为是同一个用户
     */
    public String faceSearch(String image) throws JSONException {
        JSONObject res = this.client.search(image, this.imageType, this.groupId, this.options);
        if (res.has("error_code") && res.getInt("error_code") == 0) {
            JSONObject result = res.getJSONObject("result");
            JSONArray userList = result.getJSONArray("user_list");
            if (userList.length() > 0) {
                JSONObject user = userList.getJSONObject(0);
                double score = user.getDouble("score");
                // 用户的匹配得分（score）大于80分，即可认为是同一个用户
                if (score > 80) {
                    return user.getString("user_id");
                }
            }
        }
        return null;
    }
}
